home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / utility / stub.zip / STUB.C next >
C/C++ Source or Header  |  1990-11-29  |  6KB  |  205 lines

  1. /*****************************************************************************
  2.  
  3.  Replacement WINSTUB.EXE for windows apps. This stub will start windows and 
  4.  the application simply by typing the application's name at the DOS prompt.
  5.  It will also output a message to your users when they close down windows.
  6.  The message is pointed to by 'glprnpszExit', appended to the end of this 
  7.  string is the name of the app in lower case with the first character in 
  8.  upper case.
  9.  
  10.  pr = private
  11.  au = auto
  12.  st = static
  13.  
  14.  bl = block
  15.  gl = global
  16.  fi = pr = file
  17.  
  18.  compile and link line - uses C6 W4 and either real or implict real lib.
  19.  
  20.  cl -AS -W[4,3] -c stub.c
  21.  link stub,,,slibce[r],nul
  22.  
  23.  written by Peter Morris. Compuserve ID 100016,2751
  24.  
  25. *****************************************************************************/
  26.  
  27. #include<stdio.h>
  28. #include<string.h>
  29. #include<stdlib.h>
  30. #include<memory.h>
  31. #include<ctype.h>
  32.  
  33. #define private static
  34.  
  35. #define SPACE (char)0x0020  /* hex for ASCII space char */
  36.  
  37. void *vpZmalloc(int);                     
  38.  
  39. char *npsAddString(char *,char const * const,int);    
  40.  
  41. char *npszAddNULL(char *pString);
  42.  
  43. void vStartWinAndApp(char const * const,char const * const);
  44.  
  45. char const * const npszAppNameFirstUpper(char * const);
  46.  
  47. int main(int,char **);
  48.  
  49. private char const * const glprnpszTrying="Trying to start Windows and";
  50. private char const * const glprnpszWindows="WIN";
  51. private char *glprnpszExitString="Next time remember to run Windows "
  52.                                  "before running";
  53.  
  54.  
  55. /*****************************************************************************
  56.  
  57.  malloc memory 'space' initialised.
  58.  
  59. *****************************************************************************/
  60.  
  61. void *vpZmalloc(int aublnNumbytes)
  62. {
  63.    auto void *aublvpMem;
  64.  
  65.    aublvpMem=(void *)malloc(aublnNumbytes);
  66.    memset(aublvpMem,SPACE,aublnNumbytes);
  67.  
  68.    return aublvpMem;
  69. }
  70.  
  71.  
  72.  
  73.  
  74.  
  75. /*****************************************************************************
  76.  
  77.  adds a string pointed to by npsSourceString to a buufer pointed to by
  78.  npsDest, copies nSourceLength bytes over then returns the pointer npsDest
  79.  incremented so as to point over a space character
  80.  
  81. *****************************************************************************/
  82.  
  83. char *npsAddString(char *npsDest,char const * const npsSourceString,int nSourceLength)
  84. {
  85.    strncpy(npsDest,npsSourceString,nSourceLength);
  86.    npsDest+=strlen(npsSourceString);
  87.  
  88.    return ++npsDest;
  89. }
  90.  
  91.  
  92.  
  93.  
  94.  
  95. /*****************************************************************************
  96.  
  97.  NULL terminates a string. char to set to null is given in npsString-1
  98.  
  99. *****************************************************************************/
  100. char *npszAddNULL(char *npsString)
  101. {
  102.    *(npsString-1)=(char)'\0';
  103.    return npsString;
  104. }
  105.  
  106.  
  107.  
  108.  
  109.  
  110. /*****************************************************************************
  111.  
  112.  starts windows and the app, this is pointed to by npszAppString and we use
  113.  a system call to do it. if this fails we call frintf() to report the error
  114.  else we call, when windows has shut down, fprintf with a message saying 
  115.  what ever you like
  116.  
  117. *****************************************************************************/
  118. void vStartWinandApp(char const * const npszAppString,char const * const npszArg0)
  119. {
  120.    auto char const * const aublszString=npszAppNameFirstUpper((char * const)npszArg0); 
  121.  
  122.    fprintf(stdout,"%s %s\n\n",glprnpszTrying,aublszString); 
  123.  
  124.    if(system(npszAppString)!=0)
  125.       fprintf(stderr,"Error executing - %s, errno=%d\n",npszAppString,errno);
  126.    else
  127.       fprintf(stdout,"%s %s",glprnpszExitString,aublszString);
  128. }
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135. /*****************************************************************************
  136.  
  137.  capitalises the first char of our app's name and returns a pointer to it
  138.  
  139. *****************************************************************************/
  140. char const * const npszAppNameFirstUpper(char * const npszAppName)
  141. {
  142.    auto char *aublnpszString;
  143.  
  144.    aublnpszString=strrchr(npszAppName,(int)'\\');
  145.    aublnpszString++;
  146.    strlwr(aublnpszString);
  147.    *aublnpszString=(char)toascii((int)*aublnpszString);
  148.    *aublnpszString=(char)toupper((int)*aublnpszString);
  149.  
  150.    return aublnpszString;
  151. }
  152.  
  153.  
  154.  
  155.  
  156.  
  157. /*****************************************************************************
  158.  
  159.  main - works out how much memory is in the argv array of char pointers as
  160.  strings plus 'WIN' plus all the spaces and a NULL terminator. calls 
  161.  vpZmalloc to allocate the memory then adds the strings 'WIN' and argv strings
  162.  to it. adds a null to the end of it and uuper cases it than causes windows
  163.  to start with the app and arguments passed in lpszCmdLine to the windows
  164.  app. finally it frees the memory.
  165.  
  166. *****************************************************************************/
  167. int main(int argc,char **argv)
  168. {
  169.    auto int   aublnStrlen;
  170.    auto int   aublnLoop;
  171.    auto void *aublvpMem;
  172.    auto char *aublnpszChar;
  173.  
  174.    for(aublnLoop=aublnStrlen=0;aublnLoop<argc;aublnLoop++)
  175.       aublnStrlen+=strlen(*(argv+aublnLoop));
  176.    aublnStrlen+=argc;
  177.    aublnStrlen+=strlen(glprnpszWindows);
  178.    aublnStrlen++;
  179.  
  180.    aublvpMem=vpZmalloc(aublnStrlen);
  181.    
  182.    if(aublvpMem)
  183.    {
  184.       aublnpszChar=(char *)aublvpMem;
  185.       aublnpszChar=npsAddString(aublnpszChar,glprnpszWindows,strlen(glprnpszWindows));
  186.  
  187.       for(aublnLoop=0;aublnLoop<argc;aublnLoop++)
  188.          aublnpszChar=npsAddString(aublnpszChar,(char const * const)*(argv+aublnLoop),strlen(*(argv+aublnLoop)));
  189.  
  190.       strupr(npszAddNULL(aublnpszChar));
  191.       vStartWinandApp(aublvpMem,*argv);
  192.       free(aublvpMem);
  193.       return 0;
  194.    }  
  195.    else
  196.    {
  197.       fprintf(stderr,"Error\n\n");
  198.       return 1;
  199.    }
  200. }
  201.  
  202.  
  203.  
  204.                     /************* EOF **************/
  205.